const { successData } = require('../utils/common')
const {
  fileUploadError,
  unSupportFileTypeError,
  publishGoodsError,
  updateGoodsError,
  invalidGoodsID,
  removeGoodsError,
  offGoodError,
  onGoodError,
  findGoodError,
} = require('../constant/error.type')

const {
  createGoods,
  updateGoods,
  removeGoods,
  restoreGoods,
  findGoods,
  findOneGood,
} = require('../service/goods.service')
class GoodsController {
  async upload(ctx) {
    // ctx.request.files.file ，file为formdata的key名称，获取的是上传的文件对象
    // console.log(ctx.request.files.file)
    const { file } = ctx.request.files
    // console.log(file.mimetype) // 文件格式
    const fileTypes = ['image/jpeg', 'image/png']

    if (file) {
      if (!fileTypes.includes(file.mimetype)) {
        return ctx.app.emit('error', unSupportFileTypeError, ctx)
      }
      // path.basename(file.filepath)，得到文件名
      ctx.body = successData('上传成功', {
        fileName: file.newFilename,
        size: file.size,
      })
    } else {
      return ctx.app.emit('error', fileUploadError, ctx)
    }
  }

  async create(ctx) {
    try {
      const { createdAt, updatedAt, ...res } = await createGoods(
        ctx.request.body
      )

      ctx.body = successData('发布商品成功', res)
    } catch (error) {
      console.error('新增商品失败', error)
      return ctx.app.emit('error', publishGoodsError, ctx)
    }
  }

  async update(ctx) {
    try {
      const res = await updateGoods(ctx.params.id, ctx.request.body)
      if (res) {
        ctx.body = successData('修改商品成功')
      } else {
        return ctx.app.emit('error', invalidGoodsID, ctx)
      }
    } catch (error) {
      console.error('修改商品失败', error)
      return ctx.app.emit('error', updateGoodsError, ctx)
    }
  }

  async remove(ctx) {
    try {
      const res = await removeGoods(ctx.params.id)
      if (res) {
        ctx.body = successData('删除商品成功')
      } else {
        return ctx.app.emit('error', invalidGoodsID, ctx)
      }
    } catch (error) {
      console.error('删除商品失败', error)
      return ctx.app.emit('error', removeGoodsError, ctx)
    }
  }

  async offGood(ctx) {
    try {
      const res = await removeGoods(ctx.params.id)
      if (res) {
        ctx.body = successData('下架商品成功')
      } else {
        return ctx.app.emit('error', invalidGoodsID, ctx)
      }
    } catch (error) {
      console.error('下架商品失败', error)
      return ctx.app.emit('error', offGoodError, ctx)
    }
  }

  async onGood(ctx) {
    try {
      const res = await restoreGoods(ctx.params.id)
      if (res) {
        ctx.body = successData('上架商品成功')
      } else {
        return ctx.app.emit('error', invalidGoodsID, ctx)
      }
    } catch (error) {
      console.error('上架商品失败', error)
      return ctx.app.emit('error', onGoodError, ctx)
    }
  }

  async findOne(ctx, next) {
    const { goods_id } = ctx.request.body

    try {
      const res = await findOneGood(goods_id)
      if (!res) {
        invalidGoodsID.message = '加入购物车失败，商品已下架'
        return ctx.app.emit('error', invalidGoodsID, ctx)
      }
    } catch (error) {
      console.error('获取单个商品信息失败', error)
      return ctx.app.emit('error', invalidGoodsID, ctx)
    }

    await next()
  }

  async findAll(ctx) {
    // 1. 解析pageNum，pageSize
    const { pageNum = 1, pageSize = 10 } = ctx.request.query
    try {
      // 2. 调用数据处理方法
      const res = await findGoods(pageNum, pageSize)
      // 3. 返回结果
      ctx.body = successData('获取商品列表成功', res)
    } catch (error) {
      console.error('获取商品列表失败', error)
      return ctx.app.emit('error', findGoodError, ctx)
    }
  }
}

module.exports = new GoodsController()
